package com.fly_fox.util;

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.List;

public class TimeUtil {

    public static int dateDiff(LocalDateTime before, LocalDateTime after){
        //获取第一个时间点的时间戳对应的秒数
        long t1 = before.toEpochSecond(ZoneOffset.ofHours(0));
        //获取第一个时间点在是1970年1月1日后的第几天
        long day1 = t1 /(60*60*24);
        //获取第二个时间点的时间戳对应的秒数
        long t2 = after.toEpochSecond(ZoneOffset.ofHours(0));
        //获取第二个时间点在是1970年1月1日后的第几天
        long day2 = t2/(60*60*24);
        //返回两个时间点的天数差
        return (int)(day2 - day1);
    }

    /**
     * 大的减去小的  第二个参数减去第一个参数
     * @param before
     * @param after
     * @return
     */
    public static int dateDiff(LocalDate before, LocalDate after){
        //获取第一个时间点的时间戳对应的秒数
        long t1 = before.toEpochDay();
        //获取第一个时间点在是1970年1月1日后的第几天

        //获取第二个时间点的时间戳对应的秒数
        long t2 = after.toEpochDay();
        //获取第二个时间点在是1970年1月1日后的第几天
        //返回两个时间点的天数差
        return (int)(t2 - t1);
    }

    /**
     * 获取两个时间点的月份差
     * @param dt1 第一个时间点
     * @param dt2 第二个时间点
     * @return int，即需求的月数差
     */
    public static int monthDiff(LocalDateTime dt1,LocalDateTime dt2){
        //获取第一个时间点的月份
        int month1 = dt1.getMonthValue();
        //获取第一个时间点的年份
        int year1 = dt1.getYear();
        //获取第一个时间点的月份
        int month2 = dt2.getMonthValue();
        //获取第一个时间点的年份
        int year2 = dt2.getYear();
        //返回两个时间点的月数差
        return (year2 - year1) *12 + (month2 - month1);
    }



    //  定时执行
    @Data
    public static class TimeUse<T>{

        LocalDate startDate=null;
        //  随机项目
        List<T> items;

        int interval=1;

        public void setStartDateStr(String dateStr) {
            this.startDate = LocalDate.parse(dateStr);
        }

        public T ret(){
            return ret(LocalDate.now());
        }

        public T ret(LocalDate now){
            int count= (int) ChronoUnit.DAYS.between(startDate,now);
            {
                int temp;
                if((temp=count%interval)!=0){
                count=count-temp;
            }
            }
            count=count/interval;
            if(count<0){
                throw new RuntimeException("请保证开始时间大于传入的时间");
            }
            int index=count%items.size();
            return items.get(index);
        }

        public T retWork(LocalDate now){
            int count= (int) ChronoUnit.DAYS.between(startDate,now);
            {
                int temp;
                if((temp=count%interval)!=0){
                    count=count-temp;
                }
            }
            count=count/interval;
            if(count<0){
                throw new RuntimeException("请保证开始时间大于传入的时间");
            }
            int index=count%items.size();
            return items.get(index);
        }

    }

}
